/**
 * 消息相关Mixin
 * 提供消息处理相关的公共方法和计算属性
 */

import { MESSAGE_TYPES, MESSAGE_COMMANDS, TIME_CONSTANTS } from '@/constants/messageTypes';
import { timeUtils, stringUtils } from '@/utils/common';

export const messageMixin = {
  data() {
    return {
      MESSAGE_TYPES,
      MESSAGE_COMMANDS
    };
  },

  computed: {
    /**
     * 当前用户ID
     */
    currentUserId() {
      return this.$store.getters['user/userId'] || this.$store.state.user?.userId;
    },

    /**
     * 当前聊天ID
     */
    currentChatId() {
      return this.$store.state.chat?.currentChatId;
    },

    /**
     * 当前聊天类型
     */
    currentChatType() {
      return this.$store.state.chat?.currentChatType;
    }
  },

  methods: {
    /**
     * 判断是否为自己的消息
     * @param {Object} message 消息对象
     * @returns {boolean} 是否为自己的消息
     */
    isMyMessage(message) {
      return message.senderId === this.currentUserId;
    },

    /**
     * 判断是否可以撤回消息
     * @param {Object} message 消息对象
     * @returns {boolean} 是否可以撤回
     */
    canRetractMessage(message) {
      return this.isMyMessage(message) && 
             timeUtils.compareTime(message.createTime, TIME_CONSTANTS.RETRACT_TIME_LIMIT);
    },

    /**
     * 判断是否可以编辑消息
     * @param {Object} message 消息对象
     * @returns {boolean} 是否可以编辑
     */
    canEditMessage(message) {
      return this.isMyMessage(message) && 
             message.messageType === MESSAGE_TYPES.TEXT &&
             timeUtils.compareTime(message.createTime, TIME_CONSTANTS.EDIT_TIME_LIMIT);
    },

    /**
     * 获取消息显示内容
     * @param {Object} message 消息对象
     * @returns {string} 显示内容
     */
    getMessageDisplayContent(message) {
      if (message.messageType === MESSAGE_TYPES.TEXT) {
        return message.content || '';
      }
      
      const typeLabels = {
        [MESSAGE_TYPES.IMAGE]: '[图片]',
        [MESSAGE_TYPES.VOICE_MSG]: '[语音]',
        [MESSAGE_TYPES.FILE]: '[文件]',
        [MESSAGE_TYPES.POSTCARD]: '[名片]',
        [MESSAGE_TYPES.TRANSFER]: '[转账]',
        [MESSAGE_TYPES.APP_LINK]: '[链接]',
        [MESSAGE_TYPES.VOICE_CALL]: '[语音通话]',
        [MESSAGE_TYPES.VIDEO_CALL]: '[视频通话]',
        [MESSAGE_TYPES.QUOTE]: '[引用消息]'
      };
      
      return typeLabels[message.messageType] || '[未知消息]';
    },

    /**
     * 格式化消息时间
     * @param {string|Date} createTime 创建时间
     * @returns {string} 格式化后的时间
     */
    formatMessageTime(createTime) {
      return timeUtils.formatTime(createTime, 'HH:mm');
    },

    /**
     * 获取消息状态文本
     * @param {Object} message 消息对象
     * @returns {string} 状态文本
     */
    getMessageStatusText(message) {
      if (message.status === 'sending') return '发送中';
      if (message.status === 'failed') return '发送失败';
      if (message.status === 'retracted') return '已撤回';
      if (message.isRead) return '已读';
      if (message.isDelivered) return '已送达';
      return '已发送';
    },

    /**
     * 处理消息操作命令
     * @param {string} command 命令
     * @param {Object} message 消息对象
     */
    handleMessageCommand(command, message) {
      switch (command) {
        case MESSAGE_COMMANDS.COPY:
          this.copyMessage(message);
          break;
        case MESSAGE_COMMANDS.RETRACT:
          this.retractMessage(message);
          break;
        case MESSAGE_COMMANDS.DELETE:
          this.deleteMessage(message);
          break;
        case MESSAGE_COMMANDS.QUOTE:
          this.quoteMessage(message);
          break;
        case MESSAGE_COMMANDS.EDIT:
          this.editMessage(message);
          break;
        case MESSAGE_COMMANDS.FORWARD:
          this.forwardMessage(message);
          break;
        default:
          console.warn('未知的消息操作命令:', command);
      }
    },

    /**
     * 复制消息
     * @param {Object} message 消息对象
     */
    copyMessage(message) {
      const content = this.getMessageDisplayContent(message);
      if (navigator.clipboard) {
        navigator.clipboard.writeText(content).then(() => {
          this.$message?.success('已复制到剪贴板');
        }).catch(() => {
          this.fallbackCopyToClipboard(content);
        });
      } else {
        this.fallbackCopyToClipboard(content);
      }
    },

    /**
     * 备用复制方法
     * @param {string} text 要复制的文本
     */
    fallbackCopyToClipboard(text) {
      const textArea = document.createElement('textarea');
      textArea.value = text;
      document.body.appendChild(textArea);
      textArea.focus();
      textArea.select();
      try {
        document.execCommand('copy');
        this.$message?.success('已复制到剪贴板');
      } catch (err) {
        this.$message?.error('复制失败');
      }
      document.body.removeChild(textArea);
    },

    /**
     * 撤回消息
     * @param {Object} message 消息对象
     */
    retractMessage(message) {
      this.$confirm('确定要撤回这条消息吗？', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 调用撤回API
        this.$store.dispatch('chat/retractMessage', {
          messageId: message.id,
          chatId: this.currentChatId
        });
      }).catch(() => {
        // 用户取消
      });
    },

    /**
     * 删除消息
     * @param {Object} message 消息对象
     */
    deleteMessage(message) {
      this.$confirm('确定要删除这条消息吗？', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 调用删除API
        this.$store.dispatch('chat/deleteMessage', {
          messageId: message.id,
          chatId: this.currentChatId
        });
      }).catch(() => {
        // 用户取消
      });
    },

    /**
     * 引用消息
     * @param {Object} message 消息对象
     */
    quoteMessage(message) {
      this.$emit('quote-message', message);
    },

    /**
     * 编辑消息
     * @param {Object} message 消息对象
     */
    editMessage(message) {
      this.$emit('edit-message', message);
    },

    /**
     * 转发消息
     * @param {Object} message 消息对象
     */
    forwardMessage(message) {
      this.$emit('forward-message', message);
    },

    /**
     * 滚动到底部
     */
    scrollToBottom() {
      this.$nextTick(() => {
        const content = document.getElementById('content');
        if (content) {
          content.scrollTop = content.scrollHeight;
        }
      });
    },

    /**
     * 处理消息点击
     * @param {Object} message 消息对象
     * @param {Event} event 点击事件
     */
    handleMessageClick(message, event) {
      // 可以在这里添加消息点击的通用逻辑
      this.$emit('message-click', message, event);
    },

    /**
     * 处理消息悬停
     * @param {Object} message 消息对象
     * @param {Event} event 悬停事件
     */
    handleMessageHover(message, event) {
      this.$emit('message-hover', message, event);
    }
  }
};

export default messageMixin;
